//Библиотека Qt.
#include <QCoreApplication>


//Внутренняя библиотека.
#include "vidstream.h"
#include "videvent.h"
#include "vidframe.h"


//===========================================================================//
//=Заголовок: VidStream::VidStream() - public
//=Параметры:
//=Описание: Конструктор.
//===========================================================================//
VidStream::VidStream(int index, QObject *parent) : QThread(parent)
{
moveToThread(this);

streamIndex = index;

vidFrame = NULL;
}


//===========================================================================//
//=Заголовок: void VidStream::sendFrame() - public
//=Параметры:
//=Описание: Функция отправки видеокадра в поток.
//===========================================================================//
void VidStream::sendFrame(VidFrame *vidframe) {vidFrame = vidframe; start();}


//===========================================================================//
//=Заголовок: void VidStream::getParam() - public
//=Параметры:
//=Описание: Функция возврата параметра потока.
//===========================================================================//
bool VidStream::getParam(DevParam::GET_PARAM param, QVariant *value)
{
switch(param)
	{
	case DevParam::GET_VIDEOWINDOW_CONNECTED:
		(*value) = !vidWin.isNull();
	break;
	default: return false;
}

return true;
}


//===========================================================================//
//=Заголовок: void VidStream::slotSetParam() - public slots
//=Параметры:
//=Описание: Слот установки параметра потока.
//===========================================================================//
void VidStream::slotSetParam(DevParam::SET_PARAM /*param*/, int /*value*/)
{

}


//===========================================================================//
//=Заголовок: void VidStream::slotSetParam() - public slots
//=Параметры:
//=Описание: Слот установки параметра потока.
//===========================================================================//
void VidStream::slotSetParam(DevParam::SET_PARAM param, bool value)
{
switch(param)
	{
	case DevParam::SET_MOTION_CONNECTED: {
		//Проверить, имеется ли уже в наличие детектор движения.
		//VidFilter *filter = getFilter(VidFilter::MOTION);
		//if(filter) {mutex.lock(); delete filter; mutex.unlock();}
	} break;
	default: break;
}
}


//===========================================================================//
//=Заголовок: void VidStream::slotSetParam() - public slots
//=Параметры:
//=Описание: Слот установки параметра потока.
//===========================================================================//
void VidStream::slotSetParam(DevParam::SET_PARAM param, QObject *object)
{
switch(param)
	{
	case DevParam::SET_VIDEOWINDOW: {
		vidWin = object;
		if(vidWin.isNull()) break;
		VidEvent videvent(NULL);
		QCoreApplication::sendEvent(vidWin, &videvent);
	} break;
	default: break;
}
}


//===========================================================================//
//=Заголовок: void VidStream::run() - protected
//=Параметры:
//=Описание: Функция активации нити.
//===========================================================================//
void VidStream::run()
{
if(vidWin.isNull()) return;
VidEvent videvent(vidFrame);
QCoreApplication::sendEvent(vidWin, &videvent);
}


//===========================================================================//
//=Заголовок: VidFilter *VidStream::getFilter() - private
//=Параметры:
//=Описание: Функция возврата фильтра от его типа.
//===========================================================================//
VidFilter *VidStream::getFilter(VidFilter::TYPE type)
{
foreach(VidFilter *filter, filtersList)
	{
	if(!filter) continue;
	if(filter->getType() == type) return filter;
}

return NULL;
}
